package com.qf.servlet;

import com.qf.annotation.RequiresPermissionsDesc;
import com.qf.pojo.DtsRole;
import com.qf.service.DtsPermissionService;
import com.qf.service.DtsRoleService;
import com.qf.util.Permission;
import com.qf.util.PermissionUtil;
import com.qf.util.ResponseUtil;
import com.qf.vo.PermVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Ypl
 * @version V1.0
 * @Project September-mavens
 * @Package com.qf.servlet
 * @Description:
 * @Date 2022/10/14 17:30
 */
@SuppressWarnings("all")
@RestController
@RequestMapping("/admin/role")
@Slf4j
public class AdminRoleController {

    @Autowired
    DtsRoleService dtsRoleService;

    @Autowired
    ApplicationContext applicationContext;

    @Autowired
    DtsPermissionService dtsPermissionService;

    @RequestMapping("/options")
    public Object option(){
//        查询所有的角色
        List<DtsRole> dtsRoles = dtsRoleService.finAllRole();

        List<Map<String, Object>> collect = dtsRoles.stream().map(
                dtsRole -> {
                    Map<String, Object> map = new HashMap<>();
                    map.put("value", dtsRole.getId());
                    map.put("label", dtsRole.getName());
                    return map;
                }
        ).collect(Collectors.toList());

        return ResponseUtil.ok(collect);
    }

    /**
     * 查询所有角色
     */
    @RequiresPermissions("admin:role:list")
    @RequiresPermissionsDesc(menu = { "系统管理", "角色管理" }, button = "角色查询")
    @GetMapping("/list")
    public Object listRole(@RequestParam(value = "page",defaultValue = "1") Integer page,
                           @RequestParam(value = "limit",defaultValue = "20")Integer limit,
                           @RequestParam(value = "sort",defaultValue = "add_time")String sort,
                           @RequestParam(value = "order",defaultValue = "desc") String order,
                           String rolename){
        log.info("角色管理 -- 角色查询");
        //分页查询
        Map<String, Object> byPage = dtsRoleService.findByPage(page, limit, sort, order, rolename);
        log.info("角色管理 -- 角色查询成功");

        return ResponseUtil.ok(byPage);

    }

    /**
     * 角色添加
     */
    @RequiresPermissions("admin:role:create")
    @RequiresPermissionsDesc(menu = { "系统管理", "角色管理" }, button = "角色添加")
    @PostMapping("/create")
    public Object insertRole(@RequestBody DtsRole dtsRole){
        log.info("角色管理 -- 角色添加");
        dtsRoleService.insertRole(dtsRole);
        log.info("角色管理 -- 角色添加成功");
        return ResponseUtil.ok(dtsRole);
    }

    /**
     * 角色更新
     */
    @RequiresPermissions("admin:role:update")
    @RequiresPermissionsDesc(menu = { "系统管理", "角色管理" }, button = "角色编辑")
    @PostMapping("/update")
    public Object update(@RequestBody DtsRole dtsRole){
        log.info("角色管理 -- 角色更新");
        dtsRoleService.update(dtsRole);
        log.info("角色管理 -- 角色更新成功");
        return ResponseUtil.ok();
    }

    /**
     * 角色删除
     */
    @RequiresPermissions("admin:role:delete")
    @RequiresPermissionsDesc(menu = { "系统管理", "角色管理" }, button = "角色删除")
    @PostMapping("/delete")
    public Object delete(@RequestBody DtsRole dtsRole){

        try {
            log.info("角色管理 -- 角色删除");
            dtsRoleService.deleteRole(dtsRole);
            log.info("角色管理 -- 角色删除成功");
        }catch (Exception e) {
            e.printStackTrace();
            return ResponseUtil.fail(-1,e.getMessage());
        }
        return ResponseUtil.ok();
    }

    /**
     * 角色授权列表
     *
     *      要获取
     */
    @GetMapping("/permissions")
    public Object permissons(Integer roleId){
        //根据包名获得所有的controller注解的类
        List<Permission> permissions = PermissionUtil.listPermission(applicationContext, "com.qf.servlet");

        //获取系统权限,将获取的类转换为实体对象
        List<PermVo> permVos = PermissionUtil.listPermVo(permissions);

        //判断是否是超级管理员，如果是则拥有全部的权限
        //如果不是就数据库中查询查询 角色 （roleId）相应的权限,
        boolean flag = dtsRoleService.isSuperAdmin(roleId);

        Set<String> assignedPermissions = null ;
        if(flag){//是超级管理员
            //系统所有权限
            assignedPermissions = PermissionUtil.listPermissionString(permissions);
        }else{
            assignedPermissions = dtsPermissionService.finfPsmByIds(new Integer[]{roleId});
            log.info("不是超级管理员的权限 ： {}",assignedPermissions);
        }

        Map<String,Object> data = new HashMap<>();
        //系统权限，注解上的权限
        data.put("systemPermissions",permVos);//要的就是对象集合
        //所有的权限，数据库的所有权限
        data.put("assignedPermissions",assignedPermissions);

        return ResponseUtil.ok(data);
    }

    /**
     * 角色授权操作
     */
    @PostMapping("/permissions")
    public Object permissions(@RequestBody Map<String,Object> map){
        //将容器中的数据取出
        List<String> permissions = (List<String>) map.get("permissions");//字符串集合
        //传来的是一个Json串
        int roleId = Integer.parseInt(String.valueOf(map.get("roleId")));
//        如果该角色为超级管理员，就设置全部权限
        if(dtsRoleService.isSuperAdmin(roleId)){
            permissions = new ArrayList<>();
            permissions.add("*");
        }

        dtsPermissionService.updatePermission(roleId,permissions);

        return ResponseUtil.ok();

    }
}
